package main

/*
 User Namespace
 user namespace 主要用来隔离用户的用户组ID，也就是说一个用户的在User Namespace内外是可以不同的。
 比较常用的是，在宿主机上以一个非root用户运行创建一个User Namespace,然后在User Namespace里却映射成root用户。
 */
import (
	"os/exec"
	"syscall"
	"os"
	"log"
)

func main(){

	// := 直接赋值，不用声明变量，go可以进行类型推断
	cmd := exec.Command("sh")

	// &符号的作用是取变量的地址 *是取变量的值
	cmd.SysProcAttr = &syscall.SysProcAttr{
		Cloneflags:syscall.CLONE_NEWUTS | syscall.CLONE_NEWIPC |
			       syscall.CLONE_NEWPID | syscall.CLONE_NEWNS |
			       syscall.CLONE_NEWUSER| syscall.CLONE_NEWNET  ,}

	cmd.SysProcAttr.Credential = &syscall.Credential{Uid: uint32(1), Gid: uint32(1)}

	cmd.Stdin = os.Stdin
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr

	if err := cmd.Run(); err != nil {
		log.Fatal(err)
	}

	os.Exit(-1)

}